//
//  ViewController.m
//  响应式编程
//
//  Created by 崔博 on 2017/12/25.
//  Copyright © 2017年 崔博. All rights reserved.
//

#import "ViewController.h"
#import "Person.h"
@interface ViewController ()
@property (nonatomic, strong) Person *p;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
 
    Person * p = [[Person alloc] init];
    
    // 监听name属性
    [p addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];
    _p = p;
}
// p对象的name属性变化就会到这个方法
//kvo 实际上就是监听set方法。
//  重写set方法!!

// KVO 底层时间
// 1.自定义person子类
// 2.重写setname方法，在内部恢复子类做法，通知观察者
// 3.如何让外界自定义person子类方法?修改当前对象的isa指针, 指向自定义的子类
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
    NSLog(@"%@",self.p.name);
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    static int i = 0;
    i++;
    _p.name = [NSString stringWithFormat:@"%ld",i];
}
@end
